<?php
/**
 * @package			NoNumber! Framework
 * @version			11.11.3
 *
 * @author			Peter van Westen <peter@nonumber.nl>
 * @link			http://www.nonumber.nl
 * @copyright		Copyright © 2011 NoNumber!
 * @license			http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

/**
 * BASE ON JOOMLA CORE FILE:
 * /components/com_search/models/search.php
 */

/**
 * @version		$Id: search.php 14401 2010-01-26 14:10:00Z louis $
 * @package		Joomla
 * @subpackage	Search
 * @copyright	Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
 * @license		GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant to the
 * GNU General Public License, and as distributed it includes or is derivative
 * of works licensed under the GNU General Public License or other free or open
 * source software licenses. See COPYRIGHT.php for copyright notices and
 * details.
 */

// Check to ensure this file is included in Joomla!
defined( '_JEXEC' ) or die();

jimport( 'joomla.application.component.model' );

/**
 * Search Component Search Model
 *
 * @package		Joomla
 * @subpackage	Search
 * @since 1.5
 */
class SearchModelSearch extends JModel
{
	/**
	 * Sezrch data array
	 *
	 * @var array
	 */
	var $_data = null;

	/**
	 * Search total
	 *
	 * @var integer
	 */
	var $_total = null;

	/**
	 * Search areas
	 *
	 * @var integer
	 */
	var $_areas = null;

	/**
	 * Pagination object
	 *
	 * @var object
	 */
	var $_pagination = null;

	/**
	 * Constructor
	 *
	 * @since 1.5
	 */
	function __construct()
	{
		parent::__construct();

		global $mainframe;

		//Get configuration
		$config = JFactory::getConfig();

		// Get the pagination request variables
		$this->setState( 'limit', $mainframe->getUserStateFromRequest( 'com_search.limit', 'limit', $config->getValue( 'config.list_limit' ), 'int' ) );
		$this->setState( 'limitstart', JRequest::getVar( 'limitstart', 0, '', 'int' ) );

		// Set the search parameters
		$keyword = urldecode( JRequest::getString( 'searchword' ) );
		$match = JRequest::getWord( 'searchphrase', 'all' );
		$ordering = JRequest::getWord( 'ordering', 'newest' );
		$this->setSearch( $keyword, $match, $ordering );

		//Set the search areas
		$areas = JRequest::getVar( 'areas' );
		$this->setAreas( $areas );
	}

	/**
	 * Method to set the search parameters
	 *
	 * @access	public
	 *
	 * @param string search string
	 * @param string mathcing option, exact|any|all
	 * @param string ordering option, newest|oldest|popular|alpha|category
	 */
	function setSearch( $keyword, $match = 'all', $ordering = 'newest' )
	{
		if ( isset( $keyword ) ) {
			$this->setState( 'keyword', $keyword );
		}

		if ( isset( $match ) ) {
			$this->setState( 'match', $match );
		}

		if ( isset( $ordering ) ) {
			$this->setState( 'ordering', $ordering );
		}
	}

	/**
	 * Method to set the search areas
	 *
	 * @access	public
	 *
	 * @param	array	Active areas
	 * @param	array	Search areas
	 */
	function setAreas( $active = array(), $search = array() )
	{
		$this->_areas['active'] = $active;
		$this->_areas['search'] = $search;
	}

	/**
	 * Method to get weblink item data for the category
	 *
	 * @access public
	 * @return array
	 */
	function getData()
	{
		// Lets load the content if it doesn't already exist
		if ( empty( $this->_data ) ) {
			$areas = $this->getAreas();

			JPluginHelper::importPlugin( 'search' );
			$dispatcher =& JDispatcher::getInstance();
			$results = $dispatcher->trigger( 'onSearch', array(
				$this->getState( 'keyword' ),
				$this->getState( 'match' ),
				$this->getState( 'ordering' ),
				$areas['active'] ) );

			$rows = array();
			foreach ( $results AS $result ) {
				$rows = array_merge( (array) $rows, (array) $result );
			}

			$this->_total = count( $rows );
			if ( $this->getState( 'limit' ) > 0 ) {
				$this->_data = array_splice( $rows, $this->getState( 'limitstart' ), $this->getState( 'limit' ) );
			} else {
				$this->_data = $rows;
			}

			/* >>> ADDED: Run content plugins over results */
			$mainframe =& JFactory::getApplication();
			$params =& $mainframe->getParams( 'com_content' );
			$params->set( 'nn_search', 1 );
			foreach ( $this->_data as $item ) {
				if ( $item->text != '' ) {
					$results = $dispatcher->trigger( 'onPrepareContent', array( &$item, &$params, 0 ) );
					// strip html tags from title
					$item->title = strip_tags( $item->title );
				}
			}
			/* <<< */
		}

		return $this->_data;
	}

	/**
	 * Method to get the total number of weblink items for the category
	 *
	 * @access public
	 * @return integer
	 */
	function getTotal()
	{
		return $this->_total;
	}

	/**
	 * Method to get a pagination object of the weblink items for the category
	 *
	 * @access public
	 * @return integer
	 */
	function getPagination()
	{
		// Lets load the content if it doesn't already exist
		if ( empty( $this->_pagination ) ) {
			jimport( 'joomla.html.pagination' );
			$this->_pagination = new JPagination( $this->getTotal(), $this->getState( 'limitstart' ), $this->getState( 'limit' ) );
		}

		return $this->_pagination;
	}

	/**
	 * Method to get the search areas
	 *
	 * @since 1.5
	 */
	function getAreas()
	{
		global $mainframe;

		// Load the Category data
		if ( empty( $this->_areas['search'] ) ) {
			$areas = array();

			JPluginHelper::importPlugin( 'search' );
			$dispatcher =& JDispatcher::getInstance();
			$searchareas = $dispatcher->trigger( 'onSearchAreas' );

			foreach ( $searchareas as $area ) {
				$areas = array_merge( $areas, $area );
			}

			$this->_areas['search'] = $areas;
		}

		return $this->_areas;
	}
}
